#ifndef __NIGHT_SKY_OPTIONS_H
#define __NIGHT_SKY_OPTIONS_H
#include <string>
#include <map>
#include <vector>
#include "common/uncopyable.hpp"

namespace night_sky
{
  using namespace common;

  /**
   * 引数を解析し，管理する．
   * 
   * @author krdlab
   */
  class Options : public Uncopyable
  {
  public:
    typedef std::map<std::string, int>          int_map;
    typedef std::map<std::string, std::string>  str_map;

  private:
    int_map m_intMap;
    str_map m_strMap;

  private:
    enum Param {
      PORT,
      UNKNOWN,
    };
    Param str2param(const std::string& str) const;

  private:
    void parseToMap(const std::vector<std::string>& args);

  public:
    Options(const int argc, const char* argv[]);
    ~Options();

    /**
     * 指定したキーの値を返す．
     * 
     * @param key
     *        キー文字列
     * @param def
     *        デフォルト値
     * @return キーに対応する値．キーが存在しない場合は def を返す．
     */
    int get(const std::string& key, const int def) {
      if (this->m_intMap.find(key) == this->m_intMap.end()) {
        return def;
      }
      return this->m_intMap[key];
    }

    std::string get(const std::string& key, const std::string def) {
      if (this->m_strMap.find(key) == this->m_strMap.end()) {
        return def;
      }
      return this->m_strMap[key];
    }
  };
}

#endif
